package rhplus.utilizador;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.jdo.PersistenceManager;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import rhplus.acessoBD.PMF;
import rhplus.servico.Servico;

@PersistenceCapable
public class Cliente implements Serializable {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id_cliente;

    public static final String PARTICULAR = "particular";
    public static final String EMPRESA = "empresa";

    // PARTE DO CLIENTE««««««««««««««««««««««««««««««««««««««««««««««««««««««
    /** Creates a new instance of Cliente */
    public Cliente(Long id) {
        this.id_cliente = id;
    }

    public Long getIdCliente() {
        return id_cliente;
    }

    public static void insere(Cliente c) {
        PersistenceManager pm = PMF.get().getPersistenceManager();

        try {
            pm.makePersistent(c);
        } finally {
            pm.close();
        }
    }

    public static void remove(final Long id_utente) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        try {
            pm.currentTransaction().begin();
            Cliente c = pm.getObjectById(Cliente.class, id_utente);
            pm.deletePersistent(c);

            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }
    }

    public static Pessoa devolvePorId(Long id_titular) {

        String query = "select from " + Pessoa.class.getName()
                + " where id_titular == " + id_titular;

        PersistenceManager pm = PMF.get().getPersistenceManager();

        List<Pessoa> lista = (List<Pessoa>) pm.newQuery(query).execute();

        return lista.get(0);

    }

    // PARTE DOS MEMBROS DO AGREGADO ««««««««««««««««««««««««««««««««««««««

    public static List<Pessoa> getListaDeMembrosDoAgregado(Long idTitular) {

        String query = "select from " + MembroDoAgregado.class.getName()
                + " where id_titular == " + idTitular;

        PersistenceManager pm = PMF.get().getPersistenceManager();

        List<MembroDoAgregado> lista_ids = (List<MembroDoAgregado>) pm.newQuery(query).execute();
        
        List<Pessoa> lista_membros = new LinkedList<Pessoa>();
        int i = 0;
        while(i != lista_ids.size()){
           lista_membros.add(Pessoa.devolve(lista_ids.get(i).getIdPessoa()));
           ++i;
        }
        return lista_membros;
    }

    public static void adicionaMembroDoAgregado(final Pessoa dados_membro_do_agregado, Long idTitular){

        Pessoa.insere(dados_membro_do_agregado);
        Long id_pess_mebr = Pessoa.devolveIdPessoaPorBI(dados_membro_do_agregado.getBI());
        Utente u = new Utente(id_pess_mebr, "membro"); 
        Utente.insere(u);

        MembroDoAgregado novo = new MembroDoAgregado(idTitular, id_pess_mebr);
        MembroDoAgregado.insere(novo);

    }

    public void alteraMembroDoAgregado(final MembroDoAgregado dados_membro_do_agregado) throws ClassNotFoundException,
            InstantiationException, IllegalAccessException {

        // Procura a instancia do objecto.
        long id_membro_do_agregado = dados_membro_do_agregado.getIdTitular();
        Pessoa membro_do_agregado = MembroDoAgregado.devolve(id_membro_do_agregado);

        Pessoa.altera(membro_do_agregado);
    }
}
